Markdown es una extensión que viene en RStudio para generar reportes, estos reportes pueden ser creados en pdf o html (knit pdf o knit html respectivamente), también tiene opción para crear un documento en formato Word…. pero no hagan eso!!!!.
Generalmente ocupamos el formato pdf cuando las visualizaciones que generamos en el código son estáticas (no necesitan que el usuario interactue con ellas para obtener información), el reporte se genera con LateX por lo que los fonts y en general la presentación por default es muy profesional.
Si por otro lado necesitamos que las visualizaciones que estamos entregando sean interactivas entonces se ocupa el formato html. ESTE ES UN DOCUMENTO HECHO EN MARKDOWN :)
Markdown pemite que integremos texto normal con código de R con la opción de que el código puede o no ser mostrado en el reporte final, esto nos permite tener en un solo lugar tanto la explicación en ‘humano’ de lo que estamos haciendo como el código que ocupamos para generar los resultados.
En esta clase estaremos ocupando markdowns para la entrega de todas las tareas (from now on ╭(◔ ◡ ◔)/)
###[](path/for/image)Para iniciar un documento de Rmarkdown (RMD) debes seleccionar la opcion R Markdown
Para la clase estaremos ocupando este template
Casi siempre se ocupa RStuido como el IDE donde interactúas con R. RStuido tiene 4 secciones normalmente:
install.packages("nombrepaquete")
Instalemos: ggplot2, scales, dplyr, lubridate, readr, plotly, googleVis, tidyr
Una vez que los paquetes son instalados para cargarlos en el ambiente de R y poderlos ocupar utilizamos library(nombrepaquete) \(\rightarrow\) nota que en library no se ocupan las dobles comillas para llamar al paquete.
Para obtener ayuda en R puedes ocupar el signo de interrogación seguido del nombre de la función sobre la que tienes dudas
?dim esto hará que sobre la esquina inferior derecha aparezca la información asociada al método del que pediste ayuda indicando:
En R aunque existe el símbolo = la asignación siempre se realiza utilizando el símbolo <- que indica que lo que se encuentra a la derecha se asigna a lo que está a la izquierda. En cambio el símbolo = se ocupa ÚNICAMENTE cuando estás generando columnas dentro de un data frame… lo veremos más adelante.
texto_simple <- "Ejemplo asiganción de variables"
var_num <- 13
texto_simple
## [1] "Ejemplo asiganción de variables"
var_bool_true <- T
var_bool_true_2 <- TRUE
class(var_bool_true)
## [1] "logical"
var_bool_true
## [1] TRUE
var_num_1 <- 13 #numeric
var_num_1
## [1] 13
var_num_2 <- 19.32 #numeric
var_num_2
## [1] 19.32
var_num_3 <- 10i #complex
var_num_3
## [1] 0+10i
class(var_num_2)
## [1] "numeric"
str_1 <- "ejemplo 1"
str_2 <- "ejemplo 2, con algo más"
str_1
## [1] "ejemplo 1"
fctr <- factor(c("a","b","c"))
fctr
## [1] a b c
## Levels: a b c
levels(fctr)
## [1] "a" "b" "c"
Son la base de la mayoría de las otras estructura de datos más complejas en R, se crean utilizando la función c() -concatenate-
vector_1 <- c("uno","dos","tres")
vector_2 <- c(10,20,110)
vector_1
## [1] "uno" "dos" "tres"
Para saber la longitud de un vector se ocupa la función length()
En R una lista es un vector con otros objetos adentro, y se tiene que poner explícitamente que se trata de una lista —list()—.
obj_1 <- c(2,3)
obj_2 <- c("a","b")
obj_3 <- list(1)
lista_1 <- list(obj_1, obj_2)
lista_1
## [[1]]
## [1] 2 3
##
## [[2]]
## [1] "a" "b"
obj_3
## [[1]]
## [1] 1
Para seleccionar cada objeto dentro de la lista, se ocupan dobles corchetes [[]].
lista_1[[1]]
## [1] 2 3
En R una matriz es una tabla, R tiene muchas operaciones optimizadas para poder realizar operaciones entre matrices, razón por la cuál es muy ocupada en análisis de datos :), nosotros normalmente no estaremos ocupando directamente matrices sino DataFrames una abstracción mucho más amigable y flexible.
Para definir una matriz ocupas la función matrix() indicando los datos, número de renglones, número de columnas y si debe acomodar los datos por renglón o por columna
#matriz acomodando por renglon
a_matrix <- matrix(c(1:10),
nrow=2,
ncol=5,
byrow=T)
a_matrix
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
#matriz acomodando por columna
a_matriz <- matrix(c(1:10),
nrow=5,
ncol=2,
byrow=F)
Es por mucho la estructura de datos más utilizada en R, los data frames son tablas (como las de excel), formados por renglones y columnas (en ese orden!). Por default cuando creas un
df <- data.frame(a=vector_1,
b=vector_2, stringsAsFactors = F)
df
## a b
## 1 uno 10
## 2 dos 20
## 3 tres 110
df2 <- data.frame(color=c("rojo","verde","amarillo","negro"),
estatura=c(1.68, 1.54, 1.85, 1.90),
sexo=c("F","F","M","M"))
df2
## color estatura sexo
## 1 rojo 1.68 F
## 2 verde 1.54 F
## 3 amarillo 1.85 M
## 4 negro 1.90 M
Puedes saber la dimensión de un data frame -cuántos renglones y cuántas columnas- con la función dim dim(nombre_df)
dim(df2)
## [1] 4 3
Hay varias formas de interactuar con los dataFrames:
$ para extaer una columna o renglón (el renglón tiene que tener nombre!). Lamentablemente de esta forma solo puedes acceder a una columna a la vez…df2$estatura
## [1] 1.68 1.54 1.85 1.90
#todos los renglones, ciertas columnas
df2[,2:3]
## estatura sexo
## 1 1.68 F
## 2 1.54 F
## 3 1.85 M
## 4 1.90 M
#ciertos renglones, todas las columnas
df2[2,]
## color estatura sexo
## 2 verde 1.54 F
#renglon especifico y columna especifica
df2[2,2]
## [1] 1.54
Utilizando los nombres con dplyr, lo veremos más adelante
Otras posibles formas es utilizando los nombres de las columnas e índices al mismo tiempo (nota como se regresana en el orden indicado: primero sexo y luego estatura)
df2[2,c("sexo","estatura")]
## sexo estatura
## 2 F 1.54
Para obtener los nombres de las columnas de un dataFrame puedes ocupar names(df), esto te regresará en un vector el nombre de las columnas del dataFrame en el orden en el que se encuentran en el mismo
names(df2)
## [1] "color" "estatura" "sexo"
Puedes cambiar los nombres de las columnas ocupando la misma función names(df) asignándole un nuevo vector con los nuevos nombres
names(df2) <- c("color","sex","height")
df2
## color sex height
## 1 rojo 1.68 F
## 2 verde 1.54 F
## 3 amarillo 1.85 M
## 4 negro 1.90 M
O puedes cambiar solo ciertos nombres indicando el índice de la columna a la que quieres cambiar el nombre.
names(df2)[2] <- "sexo"
df2
## color sexo height
## 1 rojo 1.68 F
## 2 verde 1.54 F
## 3 amarillo 1.85 M
## 4 negro 1.90 M
¿Por qué aquí no hizo falta el
c()?
Para saber de qué tipo es un objeto se ocupa la función class(objeto)
class(df2)
## [1] "data.frame"
Puedes hacer lo mismo con un vector dentro de un data frame
class(df2$color)
## [1] "factor"
Hay varias formas de cargar datos a R pero se tiene que tomar en cuenta el tamaño del data set. Siempre es mejor ocupar la librería readr de Hadley Wickham ;) (te presento a tu próximo nuevo ídolo!)
Cargaremos un set de datos correspondiente a información de cáncer de mama
suppressPackageStartupMessages(library(readr))
breast_cancer <- read_csv("~/Documents/itam/mineria_datos_licenciatura/data/breast_cancer.csv")
## Parsed with column specification:
## cols(
## .default = col_double(),
## id = col_integer(),
## diagnosis = col_character()
## )
## See spec(...) for full column specifications.
class(breast_cancer)
## [1] "tbl_df" "tbl" "data.frame"
head(breast_cancer)
## # A tibble: 6 x 32
## id diagnosis radius_mean texture_mean perimeter_mean area_mean
## <int> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 842302 M 17.99 10.38 122.80 1001.0
## 2 842517 M 20.57 17.77 132.90 1326.0
## 3 84300903 M 19.69 21.25 130.00 1203.0
## 4 84348301 M 11.42 20.38 77.58 386.1
## 5 84358402 M 20.29 14.34 135.10 1297.0
## 6 843786 M 12.45 15.70 82.57 477.1
## # ... with 26 more variables: smoothness_mean <dbl>,
## # compactness_mean <dbl>, concavity_mean <dbl>, `concave
## # points_mean` <dbl>, symmetry_mean <dbl>, fractal_dimension_mean <dbl>,
## # radius_se <dbl>, texture_se <dbl>, perimeter_se <dbl>, area_se <dbl>,
## # smoothness_se <dbl>, compactness_se <dbl>, concavity_se <dbl>,
## # `concave points_se` <dbl>, symmetry_se <dbl>,
## # fractal_dimension_se <dbl>, radius_worst <dbl>, texture_worst <dbl>,
## # perimeter_worst <dbl>, area_worst <dbl>, smoothness_worst <dbl>,
## # compactness_worst <dbl>, concavity_worst <dbl>, `concave
## # points_worst` <dbl>, symmetry_worst <dbl>,
## # fractal_dimension_worst <dbl>
Generalmente todo en R es un data frame o algún sabor más optimizado de él: tbl_df, tbl o tibble que pueden cargar una mayor cantidad de datos de manera más eficiente que el mortal dataFrame -optimizaciones de Hadley Wickham-
summary(breast_cancer)
## id diagnosis radius_mean texture_mean
## Min. : 8670 Length:569 Min. : 6.981 Min. : 9.71
## 1st Qu.: 869218 Class :character 1st Qu.:11.700 1st Qu.:16.17
## Median : 906024 Mode :character Median :13.370 Median :18.84
## Mean : 30371831 Mean :14.127 Mean :19.29
## 3rd Qu.: 8813129 3rd Qu.:15.780 3rd Qu.:21.80
## Max. :911320502 Max. :28.110 Max. :39.28
## perimeter_mean area_mean smoothness_mean compactness_mean
## Min. : 43.79 Min. : 143.5 Min. :0.05263 Min. :0.01938
## 1st Qu.: 75.17 1st Qu.: 420.3 1st Qu.:0.08637 1st Qu.:0.06492
## Median : 86.24 Median : 551.1 Median :0.09587 Median :0.09263
## Mean : 91.97 Mean : 654.9 Mean :0.09636 Mean :0.10434
## 3rd Qu.:104.10 3rd Qu.: 782.7 3rd Qu.:0.10530 3rd Qu.:0.13040
## Max. :188.50 Max. :2501.0 Max. :0.16340 Max. :0.34540
## concavity_mean concave points_mean symmetry_mean
## Min. :0.00000 Min. :0.00000 Min. :0.1060
## 1st Qu.:0.02956 1st Qu.:0.02031 1st Qu.:0.1619
## Median :0.06154 Median :0.03350 Median :0.1792
## Mean :0.08880 Mean :0.04892 Mean :0.1812
## 3rd Qu.:0.13070 3rd Qu.:0.07400 3rd Qu.:0.1957
## Max. :0.42680 Max. :0.20120 Max. :0.3040
## fractal_dimension_mean radius_se texture_se perimeter_se
## Min. :0.04996 Min. :0.1115 Min. :0.3602 Min. : 0.757
## 1st Qu.:0.05770 1st Qu.:0.2324 1st Qu.:0.8339 1st Qu.: 1.606
## Median :0.06154 Median :0.3242 Median :1.1080 Median : 2.287
## Mean :0.06280 Mean :0.4052 Mean :1.2169 Mean : 2.866
## 3rd Qu.:0.06612 3rd Qu.:0.4789 3rd Qu.:1.4740 3rd Qu.: 3.357
## Max. :0.09744 Max. :2.8730 Max. :4.8850 Max. :21.980
## area_se smoothness_se compactness_se concavity_se
## Min. : 6.802 Min. :0.001713 Min. :0.002252 Min. :0.00000
## 1st Qu.: 17.850 1st Qu.:0.005169 1st Qu.:0.013080 1st Qu.:0.01509
## Median : 24.530 Median :0.006380 Median :0.020450 Median :0.02589
## Mean : 40.337 Mean :0.007041 Mean :0.025478 Mean :0.03189
## 3rd Qu.: 45.190 3rd Qu.:0.008146 3rd Qu.:0.032450 3rd Qu.:0.04205
## Max. :542.200 Max. :0.031130 Max. :0.135400 Max. :0.39600
## concave points_se symmetry_se fractal_dimension_se
## Min. :0.000000 Min. :0.007882 Min. :0.0008948
## 1st Qu.:0.007638 1st Qu.:0.015160 1st Qu.:0.0022480
## Median :0.010930 Median :0.018730 Median :0.0031870
## Mean :0.011796 Mean :0.020542 Mean :0.0037949
## 3rd Qu.:0.014710 3rd Qu.:0.023480 3rd Qu.:0.0045580
## Max. :0.052790 Max. :0.078950 Max. :0.0298400
## radius_worst texture_worst perimeter_worst area_worst
## Min. : 7.93 Min. :12.02 Min. : 50.41 Min. : 185.2
## 1st Qu.:13.01 1st Qu.:21.08 1st Qu.: 84.11 1st Qu.: 515.3
## Median :14.97 Median :25.41 Median : 97.66 Median : 686.5
## Mean :16.27 Mean :25.68 Mean :107.26 Mean : 880.6
## 3rd Qu.:18.79 3rd Qu.:29.72 3rd Qu.:125.40 3rd Qu.:1084.0
## Max. :36.04 Max. :49.54 Max. :251.20 Max. :4254.0
## smoothness_worst compactness_worst concavity_worst concave points_worst
## Min. :0.07117 Min. :0.02729 Min. :0.0000 Min. :0.00000
## 1st Qu.:0.11660 1st Qu.:0.14720 1st Qu.:0.1145 1st Qu.:0.06493
## Median :0.13130 Median :0.21190 Median :0.2267 Median :0.09993
## Mean :0.13237 Mean :0.25427 Mean :0.2722 Mean :0.11461
## 3rd Qu.:0.14600 3rd Qu.:0.33910 3rd Qu.:0.3829 3rd Qu.:0.16140
## Max. :0.22260 Max. :1.05800 Max. :1.2520 Max. :0.29100
## symmetry_worst fractal_dimension_worst
## Min. :0.1565 Min. :0.05504
## 1st Qu.:0.2504 1st Qu.:0.07146
## Median :0.2822 Median :0.08004
## Mean :0.2901 Mean :0.08395
## 3rd Qu.:0.3179 3rd Qu.:0.09208
## Max. :0.6638 Max. :0.20750
¿Qué pueden decir de este set de datos?
La función mean devuelve el promedio de una columna -vector- en un dataFrame
Para conocer el promedio de la variable radius_mean
promedio_radius_mean <- mean(breast_cancer$radius_mean)
promedio_radius_mean
## [1] 14.12729
#si se desea redondear el resultado
#round(promedio_radius_mean, 2) #se redondea a 2 decimales
sd_radius_mean <- sd(breast_cancer$radius_mean)
sd_radius_mean
## [1] 3.524049
selected_rows <- breast_cancer[3:6, ] #[renglon, columna]
selected_rows #nota que se trae todas las columnas porque no definimos cuantas!
## # A tibble: 4 x 32
## id diagnosis radius_mean texture_mean perimeter_mean area_mean
## <int> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 84300903 M 19.69 21.25 130.00 1203.0
## 2 84348301 M 11.42 20.38 77.58 386.1
## 3 84358402 M 20.29 14.34 135.10 1297.0
## 4 843786 M 12.45 15.70 82.57 477.1
## # ... with 26 more variables: smoothness_mean <dbl>,
## # compactness_mean <dbl>, concavity_mean <dbl>, `concave
## # points_mean` <dbl>, symmetry_mean <dbl>, fractal_dimension_mean <dbl>,
## # radius_se <dbl>, texture_se <dbl>, perimeter_se <dbl>, area_se <dbl>,
## # smoothness_se <dbl>, compactness_se <dbl>, concavity_se <dbl>,
## # `concave points_se` <dbl>, symmetry_se <dbl>,
## # fractal_dimension_se <dbl>, radius_worst <dbl>, texture_worst <dbl>,
## # perimeter_worst <dbl>, area_worst <dbl>, smoothness_worst <dbl>,
## # compactness_worst <dbl>, concavity_worst <dbl>, `concave
## # points_worst` <dbl>, symmetry_worst <dbl>,
## # fractal_dimension_worst <dbl>
#esto es mucho más sencillo con la libreria dplyr... lo veremos mas adelante
selected_df <- breast_cancer[3:6, c("diagnosis","radius_mean")] #[renglon, columna]
selected_df
## # A tibble: 4 x 2
## diagnosis radius_mean
## <chr> <dbl>
## 1 M 19.69
## 2 M 11.42
## 3 M 20.29
## 4 M 12.45
max(breast_cancer$diagnosis)
## [1] "M"
El análisis de datos casi siempre va acompañado de una visualización (cuando es posible) ya sea para explicar a terceros que no son técnicos o para que nos ayude a entender comportamientos en los datos. En R se ocupa principalmente la librería ggplot2 para realizar gran cantidad de visualizaciones.
Si bien ggplot es difícil de entender al principio, una vez que se entiende la gramática todo funciona de manera fluida.
Ggplot tiene su propia gramática, busca que cada componente de la gráfica se pueda ir añadiendo poco a poco, siempre ocupa un componente aes en el cual definimos qué es cada eje en la gráfica.
Ocuparemos los datos que cargamos de cáncer de mama para realizar una gráficas y hacer un mini análisis exploratorio.
Cómo se ven radius_mean y texture_mean
library(ggplot2)
p <- ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean)) +
geom_point()
plot(p)
Queremos agregarle color para identificar si hay algún patrón por tipo de tumor —diagnosis—
ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean, color=diagnosis)) +
geom_point()
No me gusta el fondo gris, cambiémoslo a blanco y pongamos un titulo a la gráfica para saber de qué se trata
ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean, color=diagnosis)) +
geom_point() +
theme_bw() + #fondo blanco
ggtitle("Promedio de radio vs promedio de textura")
Ahora veamos como se ven las diferentes variables
ggplot(breast_cancer, aes(x=radius_mean)) +
geom_histogram() +
theme_bw() + #fondo blanco
ggtitle("histograma promedio de radio del tumor")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(breast_cancer, aes(x=radius_mean)) +
geom_histogram(colour="black", fill="white") +
theme_bw() + #fondo blanco
ggtitle("histograma promedio de radio del tumor")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Cómo se ve el histograma si se separan los que son de tumores benignos y tumores malignos?
ggplot(breast_cancer, aes(x=radius_mean, color=diagnosis, fill=diagnosis)) +
geom_histogram() +
theme_bw() + #fondo blanco
ggtitle("histograma promedio de radio del tumor")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
ggplot(breast_cancer, aes(x=diagnosis, y=radius_mean, fill=diagnosis)) +
geom_boxplot() +
theme_bw() + #fondo blanco
ggtitle("boxplot promedio de radio \nde acuerdo al tipo de tumor")
Obtengamos la proporción de tumores beningnos y malignos
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
prop_diagnosis <- breast_cancer %>% group_by(diagnosis) %>%
summarise(n=n()) %>% mutate(prop=n/sum(n))
ggplot(prop_diagnosis, aes(x=diagnosis, y=prop, fill=diagnosis)) +
geom_bar(stat="identity") +
theme_bw() +
scale_y_continuous(limits=c(0,1))
Algunas reglas en las visualizaciones:
¿Algo malo aquí?
* Imagen tomada de flowingdata.com
¿Qué? (╯°□°)╯︵ ┻━┻
* Imagen tomada de flowingdata.com
Paren!!!! (╯°□°)╯︵ ┻━┻
* Imagen tomada de flowingdata.com
Moraleja: Pon atención a tus visualizaciones son TAN IMPORTANTES como los modelos que realizas, es tu responsabilidad presentar información precisa, sin sesgo y que permita a los demás tomar decisiones basadas en ellas.
Como NO hacer una gráfica de barras
* Imagen tomada de viz.wtf
No hagan esto!!!! (╯°□°)╯︵ ┻━┻ \(\rightarrow\) Por eso en esta clase están prohibidos los pie!!!
* Imagen tomada de viz.wtf
Todo lo anterior está muy bonito pero los clientes generalmente quieren interactuar con los datos, aunque sea solo para saber que valor tiene un punto en particular… para ello lo que ocupamos es un wrap que le permite a las gráficas que generamos en ggplot volverlas interactivas, eso es plotly.
Se puede ocupar plotly sin R directamente en python y otros lenguajes, pero es muy ocupado en R para dar intercción a las gráficas estáticas que genera ggplot.
Esta librería se puede ocupar sin una conexión a Internet!
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
p <- ggplot(breast_cancer, aes(x=radius_mean, y=texture_mean, color=diagnosis)) +
geom_point() +
theme_bw() + #fondo blanco
ggtitle("Promedio de radio vs\npromedio de textura")
ggplotly(p)
## We recommend that you use the dev version of ggplot2 with `ggplotly()`
## Install it with: `devtools::install_github('hadley/ggplot2')`
p <- ggplot(breast_cancer, aes(x=diagnosis, y=radius_mean, fill=diagnosis)) +
geom_boxplot() +
theme_bw() + #fondo blanco
ggtitle("boxplot promedio de radio \nde acuerdo al tipo de tumor")
ggplotly(p)
## We recommend that you use the dev version of ggplot2 with `ggplotly()`
## Install it with: `devtools::install_github('hadley/ggplot2')`
Así como plotly vuelve las gráficas que generamos de ggplot interactivas, googleVis hace gráficas interactivas, aunque tristemente NO son compatibles con ggplot por lo que se tienen que generar desde 0 con la gramática propia de esa librería… (╯°□°)╯︵ ┻━┻ y además de todo se requiere estar contectado a internet cuando se muestran las visualizaciónes pues se requiere de la librería de google para que se compile el javascript que genera :(
A diferencia de ggplot que todo lo que se desea graficar debe ser columnar y solo se pueden graficar dos columnas… googleVis es al revés… cada cosa que queires graficar debe estar en su propia columna … los data frames son más anchos y cortos —en ggplot los data frames son angostos y largos—
library(googleVis)
## Creating a generic function for 'toJSON' from package 'jsonlite' in package 'googleVis'
##
## Welcome to googleVis version 0.6.2
##
## Please read Google's Terms of Use
## before you start using the package:
## https://developers.google.com/terms/
##
## Note, the plot method of googleVis will by default use
## the standard browser to display its output.
##
## See the googleVis package vignettes for more details,
## or visit http://github.com/mages/googleVis.
##
## To suppress this message use:
## suppressPackageStartupMessages(library(googleVis))
options(gvis.plot.tag='chart')
#hacer un nuevo df con solo los valores que queremos poner en la gráfica
proportions <- gvisBarChart(prop_diagnosis, xvar="diagnosis",
yvar="prop", options=list(vAxis="{title: 'diagnosis'}",
hAxis="{title: '%',
format: 'percent',
viewWindow:{min: 0,
max: 1}}"))
plot(proportions)
## R version 3.4.1 (2017-06-30)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.3 LTS
##
## Matrix products: default
## BLAS: /usr/lib/libblas/libblas.so.3.6.0
## LAPACK: /usr/lib/lapack/liblapack.so.3.6.0
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
## [5] LC_MONETARY=es_MX.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=es_MX.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=es_MX.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] googleVis_0.6.2 plotly_4.7.1 bindrcpp_0.2 dplyr_0.7.1
## [5] ggplot2_2.2.1 readr_1.1.1
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.11 compiler_3.4.1 plyr_1.8.4
## [4] bindr_0.1 tools_3.4.1 digest_0.6.12
## [7] viridisLite_0.2.0 jsonlite_1.5 evaluate_0.10.1
## [10] tibble_1.3.3 gtable_0.2.0 pkgconfig_2.0.1
## [13] rlang_0.1.1 shiny_1.0.3 crosstalk_1.0.0
## [16] yaml_2.1.14 stringr_1.2.0 httr_1.2.1
## [19] knitr_1.16 htmlwidgets_0.9 hms_0.3
## [22] rprojroot_1.2 grid_3.4.1 glue_1.1.1
## [25] data.table_1.10.4 R6_2.2.2 rmarkdown_1.6
## [28] purrr_0.2.2.2 tidyr_0.6.3 magrittr_1.5
## [31] codetools_0.2-15 backports_1.1.0 scales_0.4.1
## [34] htmltools_0.3.6 assertthat_0.2.0 xtable_1.8-2
## [37] mime_0.5 colorspace_1.3-2 httpuv_1.3.5
## [40] labeling_0.3 stringi_1.1.5 lazyeval_0.2.0
## [43] munsell_0.4.3